package controllers

import (
	"github.com/oldfeel/ofutils"
	"videoconferencing/server/models"

	"github.com/asdine/storm/q"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/cache"
	"github.com/astaxie/beego/utils/captcha"
	"github.com/vzex/dog-tunnel/common"
)

var cpt *captcha.Captcha

func init() {
	store := cache.NewMemoryCache()
	cpt = captcha.NewWithFilter("/验证码图片/", store)
	cpt.StdWidth = 118
	cpt.StdHeight = 40
}

type C用户 struct {
	BaseController
}

// @router /获取用户列表 [get]
func (c *C用户) A获取用户列表() {
	arr := make([]map[string]string, 0)
	for _, server := range common.Conn2ClientInfo {
		if server.IsServer {
			arr = append(arr, map[string]string{"name": server.ServerName, "addr": server.Conn.RemoteAddr().String()})
		}
	}
	c.Success(arr)
}

// @router /发送给所有用户 [get]
func (c *C用户) A发送给所有用户() {
	发送内容 := c.GetString("发送内容")
	for conn, info := range common.Conn2ClientInfo {
		beego.Info("发送文字", info.ServerName, 发送内容)
		common.Write(conn, "0", "发送文字", 发送内容)
	}
	c.Success("success")
}

// @router /检测用户名 [get]
func (c *C用户) A检测用户名() {
	用户名 := c.GetString("用户名")
	u := c.GetUser()

	var m models.M用户
	err := DB.Select(q.Eq("F昵称", 用户名)).First(&m)
	if err != nil {
		beego.Info("检测用户名", err)
	}
	c.Success(m.Id == 0 || m.Id == u.Id)
}

// @router /验证码 [get]
func (c *C用户) A验证码() {
	id, err := cpt.CreateCaptcha()
	if err != nil {
		c.Fail(1, err)
		return
	}
	c.Success(id)
}

// @router /登录 [get]
func (c *C用户) A登录() {
	用户名 := c.GetString("用户名")
	密码 := c.GetString("密码")

	var m models.M用户
	err := DB.Select(q.Eq("F昵称", 用户名), q.Eq("F密码", ofutils.MD5(密码))).First(&m)
	if err != nil {
		c.Fail(1, "账号或密码错误")
		return
	}
	m.Token = ofutils.RandString(32)
	DB.Save(&m)

	c.Success(m.G信息())
}

// @router /获取用户信息 [get]
func (c *C用户) A获取用户信息() {
	u := c.GetUser()
	if u.Id == 0 {
		c.Fail(-1, "token 已过期,请重新登录")
		return
	}
	c.Success(u.G信息())
}

// @router /注册 [get]
func (c *C用户) A注册() {
	用户名 := c.GetString("用户名")
	密码 := c.GetString("密码")
	邮箱 := c.GetString("邮箱")
	验证码Id := c.GetString("验证码Id")
	验证码 := c.GetString("验证码")
	if !cpt.Verify(验证码Id, 验证码) {
		c.Fail(1, "验证码错误")
		return
	}
	m := models.M用户{F昵称: 用户名, F密码: ofutils.MD5(密码), F邮箱: 邮箱}
	err := DB.Save(&m)
	if err != nil {
		c.Fail(2, err)
		return
	}
	c.Success(m.G信息())
}
